<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:doc="livcos.org/ns/doc"
  xmlns="http://www.w3.org/1999/XSL/Format"
  exclude-result-prefixes="doc">

<xsl:template match="doc:markup">
  <block margin-left="0.4cm" font-size="8pt" margin-top="0pt" margin-bottom="0pt">
    <xsl:apply-templates select="node()" mode="markup"/>
  </block>
</xsl:template>

<!-- basic elements -->
<xsl:template match="*" mode="markup">
  <block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
    <xsl:text><![CDATA[<]]></xsl:text>
    <xsl:value-of select="name(.)"/>
    <xsl:apply-templates select="@*" mode="markup"/>
    <xsl:call-template name="namespace_markup"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </block>
  <block margin-left="0.3cm">
    <xsl:apply-templates select="node()" mode="markup"/>
  </block>
  <block margin-left="0.3cm" color="blue">
    <xsl:text><![CDATA[<]]>/</xsl:text>
    <xsl:value-of select="name(.)"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </block>
</xsl:template>

<!-- elements with direct text children -->
  <xsl:template match="*[text()[normalize-space(.) != '']]" mode="markup">
  <block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
    <xsl:text><![CDATA[<]]></xsl:text>
    <xsl:value-of select="name(.)"/>
    <xsl:apply-templates select="@*" mode="markup"/>
    <xsl:call-template name="namespace_markup"/>
    <xsl:text><![CDATA[>]]></xsl:text>
    <xsl:apply-templates select="node()" mode="markup"/>
    <xsl:text><![CDATA[<]]>/</xsl:text>
    <xsl:value-of select="name(.)"/>
    <xsl:text><![CDATA[>]]></xsl:text>
  </block>
</xsl:template>

<!-- empty elements -->
<xsl:template match="*[count(node()) &lt; 1]" mode="markup">
  <xsl:choose>
    <xsl:when test="../text()[normalize-space(.) != '']">
      <inline color="blue">
        <xsl:call-template name="print_emptyElement"/>
      </inline>
    </xsl:when>
    <xsl:otherwise>
      <block margin-left="0.9cm" color="blue" text-indent="-0.6cm">
        <xsl:call-template name="print_emptyElement"/>
      </block>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="print_emptyElement">
  <xsl:text><![CDATA[<]]></xsl:text>
  <xsl:value-of select="name(.)"/>
  <xsl:apply-templates select="@*" mode="markup"/>
  <xsl:call-template name="namespace_markup"/>
  <xsl:text>/<![CDATA[>]]></xsl:text>
</xsl:template>

<!-- attributes -->
<xsl:template match="@*" mode="markup">
  <xsl:text> </xsl:text>
  <inline color="green">
    <xsl:value-of select="name(.)"/>
  </inline>
  <xsl:text>=</xsl:text>
  <inline color="black">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>"</xsl:text>
  </inline>
</xsl:template>

<!-- namespaces -->
<xsl:template name="namespace_markup">
  <xsl:variable name="e" select="." />
  <xsl:for-each select="namespace::*[name(.) != 'xml']">
    <xsl:variable name="n" select="name(.)" />
    <xsl:if test="not($e/ancestor::*[namespace::*[name(.) = $n]])">
      <xsl:text> </xsl:text>
      <inline color="green">
        <xsl:text>xmlns:</xsl:text>
        <xsl:value-of select="name(.)"/>
      </inline>
      <xsl:text>=</xsl:text>
      <inline color="black">
        <xsl:text>"</xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>"</xsl:text>
      </inline>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<!-- comments -->
<xsl:template match="comment()" mode="markup">
  <block margin-left="0.3cm" color="grey">
    <xsl:text><![CDATA[<]]>!--</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>--<![CDATA[>]]></xsl:text>
  </block>
</xsl:template>

<!-- text -->
<xsl:template match="text()" mode="markup">
  <inline color="black">
    <xsl:value-of select="normalize-space(.)"/>
  </inline>
</xsl:template>

<!-- processing instructions -->
<xsl:template match="processing-instruction()" mode="markup">
  <block margin-left="0.3cm" color="darkgrey">
    <xsl:text><![CDATA[<]]>?xml</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>?<![CDATA[>]]></xsl:text>
  </block>
</xsl:template>

</xsl:stylesheet>
